package org.opencms.free.balance.listener;

import java.util.List;

import org.opencms.free.balance.BalanceFreeNode;
import org.opencms.free.balance.BalanceFreeNodeDao;
import org.opencms.free.balance.BalanceFreeNodeDaoImpl;
import org.opencms.free.balance.client.BalanceClientFacade;
import org.opencms.main.CmsEvent;
import org.opencms.main.I_CmsEventListener;
import org.opencms.main.OpenCms;

import edu.emory.mathcs.backport.java.util.Arrays;

/**
 * Listener encargado de filtrar los eventos para lanzar la accion de recarga de cache.
 */
public class BalanceListener implements I_CmsEventListener {

    /**
     * Array de eventos ante los que tiene que responder el listener.
     */
    private int[] listEvents;

    /**
     * Constructor de la clase.
     */
    public BalanceListener() {
        // Listado de eventos ante los que tiene que responder
        // el listener
        this.listEvents = new int[] {I_CmsEventListener.EVENT_RESOURCE_CREATED,
                I_CmsEventListener.EVENT_RESOURCE_MODIFIED, I_CmsEventListener.EVENT_RESOURCE_MOVED,
                I_CmsEventListener.EVENT_RESOURCE_COPIED, I_CmsEventListener.EVENT_RESOURCE_DELETED,
                I_CmsEventListener.EVENT_RESOURCES_MODIFIED, I_CmsEventListener.EVENT_RESOURCE_AND_PROPERTIES_MODIFIED,
                I_CmsEventListener.EVENT_RESOURCES_AND_PROPERTIES_MODIFIED};
    }

    /**
     * Se captura el evento.
     */
    public void cmsEvent(final CmsEvent event) {
        // Se comprueba si se ha de limpiar la cache de los nodos del cluster.
        if (Arrays.binarySearch(this.listEvents, event.getType()) >= 0) {
            // Se obtiene el listado de nodos.
            BalanceFreeNodeDao nodeDao = new BalanceFreeNodeDaoImpl();
            List<BalanceFreeNode> listNodes = nodeDao.findAllNodes();
            // Se obtiene el nombre del servidor sobre el que se ha hecho
            // la modificacion
            String currentServer = OpenCms.getSiteManager().getWorkplaceServer();
            for (BalanceFreeNode node : listNodes) {
                // El nodo que ejecuta este metodo no se ha de limpiar.
                if (!node.getNodeUrl().contains(currentServer)) {
                    // Se van limpiando los nodos lista
                    // TODO: Incluir usuario y contraseña
                    BalanceClientFacade.reloadCache(node.getNodeUrl(), "", "");
                }
            }
        }
    }

    /**
     * Método observadro del atributo listEvents.
     */
    public int[] getListEvents() {
        return listEvents;
    }
}